<?php
namespace lib;
use Workerman\Worker;

class Http{
    function __construct($io,$config,$user){
        $http = new Worker("http://0.0.0.0:{$config['httpPort']}");
        // 由于此处使用了闭包 外部变量应该通过 use 语法传递
        $http->onMessage = function($connect)use($io,$config,$user){
            $path=parse_url($_SERVER['REQUEST_URI'])['path'];
            $p=explode('/', explode('.', $path)[0]);
            $data=$_POST;
            if(isset($p[1])&&in_array($p[1], ['admin','client','timing'])){
                //定时任务
                if(!checkToken($data,$config['pwd'])){
                    return $connect->send(error('数据验证失败'));
                }
                $res=$this->$p[1]($io,$data,$config,$user);
                if($res){
                    return $connect->send($res);
                }
                return $connect->send(success('指令发布成功'));

            }

            return $connect->send('<h1 style="text-align:center;line-height:500px;font-size:100px;color:#f60;">欢迎光临</h1>');
            
        }; //这个分号不要去掉
        $http->listen();
    }

    /**
     * 后台事件（该事件是发往后台管理中心的事件）
     * 管理中心接收到的数据为 req.body
     */
    function admin($io,$data){
        if(isset($data['member_id'])){
            $io->to($data['member_id'].'admin')->emit($data['event'],$data);
        }else{ // 广播
            $io->emit($data['event'],$data);
        }
    }

    /**
     * 定时任务
     */
    function timing($io,$data,$config){
        /**
         * 由于php定时器实现支持库不是满足业务
         * 定时任务未实现
         * 当前php部署于window系统
         * 而workerman框架的定时器实现基于 http://www.php.net/manual/zh/book.pcntl.php
         * 该扩展命令仅支持Unix系统
         * 如果需要请自行实现定时器功能
         */
        return success('任务发布成功');
    }

    /**
     * 客户端事件（该事件是发往客户端的事件，通常为任务的发布）
     * 客户端接收到的数据为 req.body.data
     */
    function client($io,$data,$config,$user){
        if(isset($data['member_id'])&&!isset($data['device_id'])){ //该用户下所有设备
            echo "client1 \r\n";
            $io->to($data['member_id'])->emit($data['event'],$data['data']);
        }else if(isset($data['member_id'])&&isset($data['device_id'])){

            $_url=$config['apiHost'].'index/Api/getSoftBodyId.html';
            $device_ids=$data['device_id'];
            $member_id=$data['member_id'];
            if(is_array($device_ids)){ //多设备发送
                echo "client2 \r\n";
                foreach ($device_ids as $key => $v) {
                    $socket_id=$user->getSocketId($member_id,$v);
                    if($socket_id){
                        $_data=$data['data'];
                        if(isset($_data['device'])&&is_string($_data['software'])){
                            $res=_curl($_url,false,'post',[
                                    'device_id'=>$v,
                                    'softids'=>$_data['software'],
                            ]);
                            if(is_string($res)){
                                $res=json_decode($res,true);
                            }
                            $_data['software']=$res;
                            $io->to($socket_id)->emit($data['event'],$_data);
                        }else{
                            $io->to($socket_id)->emit($data['event'],$_data);
                        }
                        
                    }else{
                        // 未在线设备
                    }
                }
            }else{ //单设备发送
                echo "client3 \r\n";
                $socket_id=$user->getSocketId($member_id,$device_ids);
                echo "$socket_id \r\n";
                echo "$member_id \r\n";
                echo "$device_ids \r\n";
                if($socket_id){
                    $_data=$data['data'];
                    if(isset($_data['device'])&&is_string($_data['software'])){
                        $res=_curl($_url,false,'post',[
                                'device_id'=>$device_ids,
                                'softids'=>$_data['software'],
                        ]);
                        if(is_string($res)){
                            $res=json_decode($res,true);
                        }
                        $_data['software']=$res;
                        $io->to($socket_id)->emit($data['event'],$_data);
                    }else{
                        $io->to($socket_id)->emit($data['event'],$_data);
                    }
                    
                }else{
                    echo "client4 \r\n";
                    // 未在线设备
                }
            }
            // 任务管理器更新数据(后台页面统一数据)
            $io->to($data['member_id'].'admin')->emit('updateDev',[
                'data'=>[$data['device_id']]
            ]);
        }
    }
    


    
}